iT邦幫忙

2022 iThome 鐵人賽

DAY 17
0

Review

AOP是在處理Cross-cutting concerns,將某段代碼(日誌)動態切入(不把日誌程式hardcode到業務邏輯方法中)到指定方法(加減乘除)的指定位置進行運行。
昨天我們學到了AOP中的專業術語及Advice的類型

  • Aspect
  • Pointcut
  • Joint point
  • Advice

今日我們沿用前日的例子,來講解AOP的細節

切面切入的物件在ioc中為代理對象

JDK動態代理(有實作Interface)

切面切入的物件與目標物件皆實作interface,container保存的物件會是代理對象,所以getBean時需要使用接口類型承接,而非MyCalculator

@Test
public void testDay19(){
    ApplicationContext ioc = new ClassPathXmlApplicationContext("bean19.xml");
    System.out.println("容器啟動完成....");
    Calculator calculator = ioc.getBean(Calculator.class);
    System.out.println(calculator);
    System.out.println(calculator.getClass());
}

Result:此為JDK的動態代理,所以類型為com.sun.proxy
https://ithelp.ithome.com.tw/upload/images/20221004/20128084ZOb6xgtdgF.jpg

Cglib動態代理(無實作Interface)

將實作介面去除

@Service
public class MyCalculator{

    public int add(int i, int j) {
        int result = i+j;
        return result;
    }

    public int sub(int i, int j) {
        int result = i-j;
        return result;
    }

    public int mul(int i, int j) {
        int result = i*j;
        return result;
    }

    public int div(int i, int j) {
        int result = i/j;
        return result;
    }
}

getBean改用MyCalculator承接

@Test
public void testDay19(){
    ApplicationContext ioc = new ClassPathXmlApplicationContext("bean19.xml");
    System.out.println("容器啟動完成....");
    MyCalculator calculator = ioc.getBean(MyCalculator.class);
    System.out.println(calculator);
    System.out.println(calculator.getClass());
}

Result:為Cglig的內部類
https://ithelp.ithome.com.tw/upload/images/20221004/2012808454fmZTkEvS.jpg

切入點表達式

固定格式: execution(存取修飾子 返回類型 方法全類名(參數表))
通配符:

星號*

  1. 匹配一個或多個字符:execution(public int com.swj.MyCalr.(int,int))
  2. 匹配任意參數:execution(public int com.swj.MyCal*.(int,))
  3. 只能匹配一層路徑
  4. 存取修飾子*不能,public可省略

點點..

  1. 匹配任意多個參數與任意類型參數
  2. 匹配多層路徑
    execution(public int com.swj..MyCal*.*(..))

Combining Pointcut Expressions(&&、||、!)


上一篇
Day18 - AOP 初試啼聲
下一篇
Day20 - AOP (2) Advice
系列文
這些年,我們早該學會的Spring Framework30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言